home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / minix / libsrc~1.z / libsrc~1 / getgrent.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-12-28  |  2.1 KB  |  117 lines

  1. #include "lib.h"
  2. /*
  3.  * get entry from group file
  4.  * 
  5.  * By: Patrick van Kleef
  6.  */
  7. #include "lib.h"
  8. #include <grp.h>
  9.  
  10. #define PRIVATE static
  11.  
  12. PRIVATE char _gr_file[] = "/etc/group";
  13. PRIVATE char _grbuf[256];
  14. PRIVATE char _buffer[1024];
  15. PRIVATE char *_pnt;
  16. PRIVATE char *_buf;
  17. PRIVATE int  _gfd = -1;
  18. PRIVATE int  _bufcnt;
  19. PRIVATE struct group grp;
  20.  
  21. int setgrent ()
  22. {
  23.         if (_gfd >= 0)
  24.             lseek (_gfd, 0L, 0);
  25.         else
  26.             _gfd = open (_gr_file, 0);
  27.  
  28.         _bufcnt = 0;
  29.         return (_gfd);
  30. }
  31.  
  32.  
  33. void endgrent () 
  34. {
  35.         if (_gfd >= 0)
  36.             close (_gfd);
  37.  
  38.         _gfd = -1;
  39.         _bufcnt = 0;
  40. }
  41.  
  42.  
  43. static int getline () 
  44. {
  45.         if (_gfd < 0 && setgrent () < 0)
  46.             return (0);
  47.  
  48.         _buf = _grbuf;
  49.         do {
  50.             if (--_bufcnt <= 0){
  51.                     if ((_bufcnt = read (_gfd, _buffer, 1024)) <= 0)
  52.                         return (0);
  53.                     else
  54.                         _pnt = _buffer;
  55.         }
  56.             *_buf++ = *_pnt++;
  57.         } while (*_pnt != '\n');
  58.         _pnt++;
  59.         _bufcnt--;
  60.         *_buf = 0;
  61.         _buf = _grbuf;
  62.         return (1);
  63. }
  64.  
  65. static void skip_period () 
  66. {
  67.         while ((*_buf) && (*_buf != ':'))
  68.             _buf++;
  69.         *_buf++ = '\0';
  70. }
  71.  
  72. struct group   *getgrent () 
  73. {
  74.         if (getline () == 0)
  75.                return (0);
  76.  
  77.         grp.gr_name = _buf;
  78.         skip_period ();
  79.         grp.gr_passwd = _buf;
  80.         skip_period ();
  81.         grp.gr_gid = atoi (_buf);
  82.         skip_period ();
  83.         return (&grp);
  84. }
  85.  
  86. struct group   *getgrnam (name)
  87. _CONST char   *name;
  88. {
  89.         struct group *grp;
  90.  
  91.         setgrent ();
  92.         while ((grp = getgrent ()) != 0)
  93.             if (!strcmp (grp -> gr_name, name))
  94.                     break;
  95.         endgrent ();
  96.         if (grp != 0)
  97.             return (grp);
  98.         else
  99.             return (0);
  100. }
  101.  
  102. struct group   *getgrgid (ggid)
  103. int     ggid;
  104. {
  105.         struct group   *grp;
  106.  
  107.         setgrent ();
  108.         while ((grp = getgrent ()) != 0)
  109.             if (grp -> gr_gid == ggid)
  110.                     break;
  111.         endgrent ();
  112.         if (grp != 0)
  113.             return (grp);
  114.         else
  115.             return (0);
  116. }
  117.